#include "STC8H.h"
#include "intrins.h"
#include "stdint.h"




// 硬件I2C配置
#define SSD1315_ADDR    0x3C    // I2C设备地址
#define I2C_SPEED       100000  // 400kHz标准模式
#define FOSC_SPEED      11059200 //时钟频率

// SSD1315命令定义
#define SET_CONTRAST    0x81
#define DISPLAY_ON      0xAF
#define DISPLAY_OFF     0xAE
#define SET_DISP_START  0x40
#define SET_MUX_RATIO   0xA8
#define SET_DISP_OFFSET 0xD3
#define SET_COM_CFG     0xDA
#define SET_CLK_DIV     0xD5
#define SET_PRECHARGE   0xD9
#define SET_VCOM_DESEL  0xDB


// typedef unsigned char uint8_t;
// typedef  unsigned int uint16_t;
// 硬件I2C初始化
void I2C_Init() {
    P1M0 = 0x00; P1M1 = 0x00; 
 
 
  // P2.1(SCL), P2.2(SDA) 设置为开漏模式

    I2CCFG |= (FOSC_SPEED / 2 / I2C_SPEED - 4) / 2; // 时钟分频计算
    
    I2CCFG |= 0xc0;  // 使能I2C主机模式
    I2CMSST = 0x00; // 清除状态寄存器
 //   I2CMSAUX = 0x00;

}

void I2C_Wait(){
    while (!(I2CMSST & 0x40)); // 等待传输完成
    I2CMSST &= ~0x40; // 清除标志位
}

// I2C启动传输
void I2C_Start() {
    I2CMSCR = 0x01;  // 发送START条件
    I2C_Wait();
}

// I2C停止传输
void I2C_Stop() {
    I2CMSCR = 0x06;  // 发送STOP条件
    I2C_Wait();
}

void Recv_ACK(){
    I2CMSCR = 0x03;
    I2C_Wait();
}

// 发送单字节
void I2C_SendByte(uint8_t dat) {
    I2CTXD = dat;
    I2CMSCR = 0x02;  // 发送数据
    I2C_Wait();
    Recv_ACK();
}

// 发送SSD1315命令
void SSD1315_WriteCmd(uint8_t cmd) {
    I2C_Start();
    I2C_SendByte(SSD1315_ADDR << 1); // 写模式
//    if(mode){I2C_SendByte(0x40);}else{I2C_SendByte(0x00);}
    I2C_SendByte(0x00);              // Co=1, D/C#=0
    I2C_SendByte(cmd);
    I2C_Stop();
}



// 初始化SSD1315
void SSD1315_Init() {
    SSD1315_WriteCmd(DISPLAY_OFF); //关闭屏幕
    SSD1315_WriteCmd(0x20);
    SSD1315_WriteCmd(0x00);

    SSD1315_WriteCmd(0xd5);
    SSD1315_WriteCmd(0x80);

    SSD1315_WriteCmd(0xa8);
    SSD1315_WriteCmd(0x3f);

    SSD1315_WriteCmd(0xd3);
    SSD1315_WriteCmd(0x00);

    SSD1315_WriteCmd(0x40);

    SSD1315_WriteCmd(0xa1);

    SSD1315_WriteCmd(0xc8);

    SSD1315_WriteCmd(0xda);         
    SSD1315_WriteCmd(0x12);

    SSD1315_WriteCmd(0x81);         
    SSD1315_WriteCmd(0xcf);

    SSD1315_WriteCmd(0xd9);         
    SSD1315_WriteCmd(0xf1);

    SSD1315_WriteCmd(0xdb);
    SSD1315_WriteCmd(0x30);

    SSD1315_WriteCmd(0xa4);         

    SSD1315_WriteCmd(0xa6);

    SSD1315_WriteCmd(0x8d);         // charge pump enable
    SSD1315_WriteCmd(0x14);

    SSD1315_WriteCmd(DISPLAY_ON); //开启屏幕
}

// 全屏填充测试
void ScreenTest() {
    uint16_t i ;
    I2C_Start();
    I2C_SendByte(SSD1315_ADDR << 1);
    I2C_SendByte(0x40); // Co=0, 连续数据模式
    
    for(i=0; i<1024; i++) { // 128x64/8=1024字节
        I2C_SendByte(0xff); // 填充全白
    }

    I2C_Stop();
}

void main() {
//    P1 = 0xff;
    P_SW2 |= 0x80;  //扩展寄存器XFR访问使能
    I2C_Init();
    SSD1315_Init();
    ScreenTest();
    
    while(1) {
//        I2C_SendByte(0xff);
        // 保持显示
    }
}